package cn.edu.lsu.integratedsurvey.exception;

import cn.edu.lsu.integratedsurvey.tool.R;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.PermissionDeniedDataAccessException;
import org.springframework.dao.TransientDataAccessResourceException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.annotation.processing.FilerException;
import java.net.SocketTimeoutException;
import java.time.format.DateTimeParseException;

/**
 * 自定义异常处理器
 *
 * @author Jasmine-drs
 * @date 2022/11/3 18:26
 */
@RestControllerAdvice
public class HandelException {

    //    拦截所有异常,处理后返回统一格式
    @ExceptionHandler
    public R<String> doException(Exception e) {
//        记录日志
//        通知各级
//        处理异常
        e.printStackTrace();
        return R.err("服务器异常，请通知管理人员！");
    }

    /**
     * 处理运行时异常
     *
     * @param e 运行时异常
     * @return 提示信息
     */
    @ExceptionHandler(RuntimeException.class)
    public R<String> runtimeException(RuntimeException e) {
        e.printStackTrace();
        return R.err(e.getMessage());
    }

    /**
     * 处理连接超时异常
     *
     * @param e 连接超时异常
     * @return 提示信息
     */
    @ExceptionHandler(SocketTimeoutException.class)
    public R<String> socketTimeoutException(SocketTimeoutException e) {
        e.printStackTrace();
        return R.err("连接超时，请重试");
    }

//	/**
//	 * 处理json异常
//	 *
//	 * @param e json异常
//	 * @return 提示信息
//	 */
//	@ExceptionHandler(JSONException.class)
//	public R<String> jsonException(JSONException e) {
//		e.printStackTrace();
//		return R.err("答案内容错误，请重试");
//	}

    /**
     * 处理图数据库登录失败
     *
     * @param e 图数据库登录失败
     * @return 提示信息
     */
    @ExceptionHandler(PermissionDeniedDataAccessException.class)
    public R<String> permissionDeniedDataAccessException(PermissionDeniedDataAccessException e) {
        e.printStackTrace();
        return R.err("数据库登录失败");
    }

    /**
     * 处理图数据库连接异常
     *
     * @param e 图数据库连接异常
     * @return 提示信息
     */
    @ExceptionHandler(TransientDataAccessResourceException.class)
    public R<String> transientDataAccessResourceException(TransientDataAccessResourceException e) {
        e.printStackTrace();
        return R.err("数据库连接异常");
    }

    /**
     * 日期格式异常
     *
     * @param e 日期格式异常
     * @return 提示信息
     */
    @ExceptionHandler(DateTimeParseException.class)
    public R<String> dateTimeParseException(DateTimeParseException e) {
        e.printStackTrace();
        return R.err("日期格式异常");
    }

    /**
     * 非法状态或参数缺失
     *
     * @param e 非法状态
     * @return 提示信息
     */
    @ExceptionHandler(IllegalStateException.class)
    public R<String> illegalStateException(IllegalStateException e) {
        e.printStackTrace();
        return R.err("非法状态或参数缺失");
    }

    /**
     * 文件异常
     *
     * @param e 文件异常
     * @return 提示信息
     */
    @ExceptionHandler(FilerException.class)
    public R<String> filerException(FilerException e) {
        e.printStackTrace();
        return R.err("文件路径不存在");
    }

    /**
     * 处理数据完整性违规异常
     *
     * @param e 数据完整性违规异常
     * @return 提示信息
     */
    @ExceptionHandler(DataIntegrityViolationException.class)
    public R<String> dataIntegrityViolationException(DataIntegrityViolationException e) {
        e.printStackTrace();
        return R.err("数据重复或长度越界");
    }

    /**
     * 处理自定义异常
     *
     * @param e 自定义异常
     * @return 提示信息
     */
    @ExceptionHandler(SystemException.class)
    public R<String> SystemException(SystemException e) {
        e.printStackTrace();
        return R.err(e.getMessage());
    }

    /**
     * 处理参数接收不到的异常
     *
     * @param e 异常
     * @return 提示信息
     */
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public R<String> MissingServletRequestParameterException(MissingServletRequestParameterException e) {
        e.printStackTrace();
        return R.err("携带参数缺失");
    }
}
